﻿using OT.HikiSecureCenterApis.Req;
using OT.HikiSecureCenterApis.Res;
using OT.HikiSecureCenterApis.Service.Video.Req;
using OT.HikiSecureCenterApis.Service.Video.Res;
namespace OT.HikiSecureCenterApis.Service.Video
{
    /// <summary>
    /// 视频应用服务 --> 视频资源
    /// </summary>
    public partial class VideoService
    {

        #region 编码设备信息
        /// <summary>
        /// 查询编码设备列表v2  /api/resource/v2/encodeDevice/search
        /// 根据条件查询目录下有权限的编码设备列表。
        /// 当返回字段对应的值为空时，该字段不返回。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="req">查询参数</param>
        /// <returns><see cref="ResDeviceSearch"/></returns>
        public async Task<ResParameter<ResPageData<ResDeviceSearch>>?> DeviceSearchAsync(ReqSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResDeviceSearch>>("/api/resource/v2/encodeDevice/search", 1.4, req);
        /// <summary>
        /// 根据区域获取下级编码设备列表  /api/resource/v1/encodeDevice/subResources
        /// 根据区域编码、资源操作权限码分页获取当前区域下（不包含子区域）有权限的编码设备列表，主要用于逐层获取区域下的编码设备信息。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="regionIndexCode">必填 父区域编号；可通过区域信息接口获取</param>
        /// <param name="page">必填 当前页码、分页大小</param>
        /// <param name="authCodes">非必填 权限码集合 ; String[]，详见附录A.3 资源权限码中的编码设备对应的资源权限码 ,权限码个数<=20个； 
        /// 单个权限码长度<=40Byte； 当authCodes为空时，则不进行权限过滤； 当authCodes为空时，则只返回对应权限码的资源信息
        /// https://open.hikvision.com/docs/0f6e8e1e41a14304aeecd287530b9c95?curNodeId=0f6e8e1e41a14304aeecd287530b9c95#c92e73ec
        /// </param>
        /// <returns><see cref="ResDeviceSubResources"/></returns>
        public async Task<ResParameter<ResPageData<ResDeviceSubResources>>?> DeviceSubResourcesAsync(string regionIndexCode, ReqPage page, IList<string> authCodes) =>
  await SecureCenterApis.PostAsync<ResPageData<ResDeviceSubResources>>("/api/resource/v1/encodeDevice/subResources", 1.4, new
  {
      regionIndexCode = regionIndexCode,
      pageNo = page.pageNo,
      pageSize = page.pageSize,
      authCodes = authCodes
  });
        /// <summary>
        /// 增量获取编码设备数据  /api/resource/v1/encodeDevice/timeRange
        /// 根据资源类型、时间段增量获取资源，包含已删除数据。资源密码以*代替，其中开始日期与结束日期的时间差必须在1-48小时内。
        /// 当返回字段对应的值为空时，该字段不返回。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="req">查询参数</param>
        /// <returns><see cref="ResDeviceSearch"/></returns>
        public async Task<ResParameter<ResPageData<ResDeviceSearch>>?> DeviceTimeRangeAsync(ReqPageDate req) =>
  await SecureCenterApis.PostAsync<ResPageData<ResDeviceSearch>>("/api/resource/v1/encodeDevice/timeRange", 1.4, req);
        #endregion

        #region 监控点信息
        /// <summary>
        /// 查询监控点列表v2  /api/resource/v2/camera/search
        /// 根据条件查询目录下有权限的监控点列表。
        /// 当返回字段对应的值为空时，该字段不返回。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="req">查询参数</param>
        /// <returns><see cref="ResCameraSearch"/></returns>
        public async Task<ResParameter<ResPageData<ResCameraSearch>>?> CameraSearchAsync(ReqSearch req) =>
  await SecureCenterApis.PostAsync<ResPageData<ResCameraSearch>>("/api/resource/v2/camera/search", 1.4, req);
        /// <summary>
        /// 分页获取监控点资源  /api/resource/v1/cameras
        /// 获取监控点列表接口可用来全量同步监控点信息，返回结果分页展示。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.0及以上版本</remarks>
        /// <param name="req">查询参数</param>
        /// <returns><see cref="ResCameras"/></returns>
        public async Task<ResParameter<ResPageData<ResCameras>>?> CamerasAsync(ReqPage req) =>
  await SecureCenterApis.PostAsync<ResPageData<ResCameras>>("/api/resource/v1/cameras", 1.0, req);
        /// <summary>
        /// 根据区域编号获取下级监控点列表  /api/resource/v1/regions/regionIndexCode/cameras
        /// 根据指定的区域编号获取该区域下的监控点列表信息，返回结果分页展示。
        /// 注：返回的监控点不包括下级区域的。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.0及以上版本</remarks>
        /// <param name="regionIndexCode">必填 父区域编号；可通过区域信息接口获取</param>
        /// <param name="page">必填 当前页码、分页大小</param>
        /// <returns><see cref="ResCameras"/></returns>
        public async Task<ResParameter<ResPageData<ResCameras>>?> CameraRegionSearchAsync(string regionIndexCode, ReqPage page) =>
  await SecureCenterApis.PostAsync<ResPageData<ResCameras>>("/api/resource/v1/regions/regionIndexCode/cameras", 1.0, new
  {
      regionIndexCode = regionIndexCode,
      pageNo = page.pageNo,
      pageSize = page.pageSize
  });
        /// <summary>
        /// 根据编号获取监控点详细信息 /api/resource/v1/cameras/indexCode
        /// 获取单个监控点信息是指根据监控点唯一标识来获取指定的监控点信息。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.0及以上版本</remarks>
        /// <param name="cameraIndexCode">必填 监控点编号，  可通过分页获取监控点资源获取</param>
        /// <returns><see cref="ResCameras"/></returns>
        public async Task<ResParameter<ResPageData<ResCameras>>?> CameraIndexCodeSearchAsync(string cameraIndexCode) =>
  await SecureCenterApis.PostAsync<ResPageData<ResCameras>>("/api/resource/v1/cameras/indexCode", 1.0, new { cameraIndexCode = cameraIndexCode });
        /// <summary>
        /// 增量获取监控点数据  /api/resource/v1/camera/timeRange
        /// 根据资源类型、时间段增量获取资源，包含已删除数据。其中开始日期与结束日期的时间差必须在1-48小时内。
        /// 当返回字段对应的值为空时，该字段不返回。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="req">查询参数</param>
        /// <returns><see cref="ResCameraSearch"/></returns>
        public async Task<ResParameter<ResPageData<ResCameraSearch>>?> CameraTimeRangeSearchAsync(ReqPageDate req) =>
  await SecureCenterApis.PostAsync<ResPageData<ResCameraSearch>>("/api/resource/v1/camera/timeRange", 1.4, req);
        #endregion

        #region 报警输出信息
        /// <summary>
        /// 查询报警输出列表 /api/resource/v1/alarmOut/search
        /// 根据条件查询目录下有权限的报警输出列表
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.5及以上版本</remarks>
        /// <param name="req">查询参数</param>
        /// <returns><see cref="ResAlarm"/></returns>
        public async Task<ResParameter<ResPageData<ResAlarm>>?> AlarmOutSearchAsync(ReqSearch req) =>
  await SecureCenterApis.PostAsync<ResPageData<ResAlarm>>("/api/resource/v1/alarmOut/search", 1.5, req);
        /// <summary>
        /// 增量获取报警输出数据 /api/resource/v1/alarmOut/timeRange
        /// 根据资源类型、时间段增量获取资源，包含已删除数据。资源密码以*代替，其中开始日期与结束日期的时间差必须在1-48小时内。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.5及以上版本</remarks>
        /// <param name="req">查询参数</param>
        /// <returns><see cref="ResAlarm"/></returns>
        public async Task<ResParameter<ResPageData<ResAlarm>>?> AlarmTimeRangeAsync(ReqPageDate req) =>
  await SecureCenterApis.PostAsync<ResPageData<ResAlarm>>("/api/resource/v1/alarmOut/timeRange", 1.5, req);

        #endregion
    }
}
